Automated Presentation of directory src/swtools/MMmalloc/

HUB | Up | Download | Pheedbak | Tree | Topic | A-Z | Search | Hot | New


Please be aware: what appears below are the v4.2 DT bits in auto-generated html form.
As we have the time, we will update these to reflect the current "state of the world".


README file from "MMmalloc" directory


MMmalloc

Alpha Release	V.23

					    Gianni Mariani 7-Apr-1994

Intro
-----

This library, pronounced "M" "M" malloc, is a plug in replacement of
the "libmalloc" library ( see malloc(3X) ). In general it is faster,
more memory efficient and has better functionality than the original
libmalloc.  A major feature is to be able to recycle memory so as to
reduce swapping and swap requirements.  Compared to the recent version
of libc's malloc it is faster with comparable memory usage and aging
characteristics.

It is important to note that all comments on other libraries or
features in this document will refer to IRIX 5.2 and not to earlier
IRIX releases.

Feature Summary
---------------

MMmalloc feature set brief.

 . Plug replacement for /lib/libmalloc.so. ( see malloc(3X) )
 . Faster than libmalloc and libc's malloc.
 . More memory efficient than libmalloc.
 . Memory recycle feature.
 . Highly tunable yet easy to use defaults.
 . Tuned realloc performance.
 . Malloc trash debugging support.
 . Better shared memory arena support.
 . Better memalign support.
 . Tunable alignment of addresses returned by malloc.

Performace of any malloc library is highly dependent on the pattern of
memory usage by the application.  Relative performance of various
malloc's can vary wildly even on different data sets in the same
application so performance quotes are highly subjective.  However most
malloc's have none or limited ways of tuning while MMmalloc is very
flexible.

Where is MMmalloc suited ?
--------------------------

MMmalloc suits larger long lived applications with large cyclic memory
usage.  Example are the X Server, image processing applications,
large database servers and larger Motif applications.

Where is MMmalloc NOT suited ?
------------------------------

Short lived applications with small dynamic memory usage.  In these
cases you should stick it out with libc since it has excellent malloc
characteristics for this sort of application.

Files in this Directory
-----------------------

README		    : this->README
MMinstall	    : csh script to install MMmalloc onto an IRIX 5.2 system
MMfire		    : sh script to make all armed processes call recycle
MMdbx		    : dbx script to dump information about an MMmalloc error
libmalloc.so	    : the MMmalloc libmalloc plug compatible dso
libamalloc.so	    : the MMmalloc amalloc library ( see amalloc(3P) )
MMmalloc.h	    : additional MMmalloc defines to compliment <malloc.h>

How to use MMmalloc
-------------------

MMmalloc can be installed as the default libmalloc library for a
system. This will effect all applications linked with libmalloc. To
install MMmalloc you can use MMinstall in the same directory you found
this README file. Simply invoke MMinstall as root and any applications
linked with libmalloc (-lmalloc) will now use MMmalloc.  MMinstall will
place the original libmalloc in /lib/libmalloc.so.orig and the MMmalloc
library will be /lib/libmalloc.so .

If you are less inclined to adventure you can also set the environment
variable LD_LIBRARY_PATH to the directory that contains the MMmalloc
library however you will need to create /var/malloc/ArmMMmalloc
yourself if you wish to try MMfire.  See rld(1) for more detail.

You may also use MMmalloc with ELF binaries not linked with -lmalloc by
setting the environment variable _RLD_LIST as below.

    _RLD_LIST=libmalloc.so:DEFAULT
    export _RLD_LIST

A small shell script named MMfire will send a SIGRTMIN signal to all
processes that are currently are armed to recycle().  The contents of
the file /tmp/MMmalloc.log will contains a recycle report if it is
enabled. The signal used may be changed in the future.  Do not create a
production application that depends on MMmalloc using SIGRTMIN for
recycle as it will likely fail in future releases of MMmalloc.  MMfire
will kill some applications that reset the SIGRTMIN signal (e.g. 4Dwm
or Xsgi).

MMfire usage :
    MMfire	: fire recycle and echo lines added to /tmp/MMmalloc.log
    MMfire -s	: silent operation
    MMfire -v	: List process armed and fire recycle.
    MMfire -u	: Don't fire recycle but list processes currently armed.

MMdbx contains a simple set of dbx commands do print malloc_check
information if it is available.  If values printed are (nil) then
malloc_check did not detect a corruption.  See more information on
malloc_check and MALLOC_DEBUG below.

Description
-----------

The algorithm used in MMmalloc is similar on the surface to libmalloc.
The libmalloc algorithm uses two types of allocators.  One is a "quick"
allocator for small allocations of equal size and the other a more
traditional free list search allocator.  There are a set of quick
allocators, each dedicated to requests of a single size ( sizes are
rounded up to some power of 2 ) each quick allocator will allocate a
large block which it will use to satisfy multiple smaller requests. 
The normal allocator in libmalloc is a non-exhaustive linear free list
search allocator.  MMmalloc has a similar two staged approach with
totally new allocation and deallocation algorithms.

MMmalloc's "quick" allocator is adaptive. Most applications will make
many malloc requests for a small set of sizes. The "quick" allocator
will only be activated after a threshold number of requests for a
particular size have been issued.  This saves memory from avoiding the
allocation of mostly empty large quick allocator blocks for rarely used
sizes.  Another adaptiveness is that the quick block size will grow as
the number of requests for a size increases to minimize the amount of
time allocating and freeing quick allocator blocks.  One major
advantage over libmalloc is that MMmalloc quick allocator blocks are
free'd to the normal allocator once all quick allocations in a quick
block are free'd while libmalloc will always retain a quick allocator
block for a quick allocator of a particular size.  This flexibility
makes MMmalloc quick allocators suited for larger sizes with less waste
than libmalloc. Quick allocators also have a 4 byte header overhead for
each allocation so they may use less memory than the normal allocator
which has an 8 byte overhead. ( 64 bit systems have 8/16 byte overhead)

Improvements in the normal allocator come from the manipulation of
multiple free lists.  libmalloc basically has three free lists.  One
list for free blocks too small and hence ignored by malloc but
coalescable by free, one for the most recently sbrk'd block and the
main long double linked list of free blocks. MMmalloc can utilize
hundreds of free lists in a three tiered linear sized bucket
configuration. Indeed the algorithm becomes an exercise in efficient
management of free lists.  For example, the default configuration of
MMmalloc has 130 free lists, the first 120 lists cover sizes of
multiples of 32, the next 7 lists are multiples of 4096 and the last 3
are multiples of 262144 with the last list taking all the rest. Each
free list behaves in a similar fashion to the main libmalloc free list.
An allocation attempt will check a number of the first elements on the
free list but not exhaustive, in this regard it is the same as
libmalloc, however, libmalloc will request a new block from the system
at this point while MMmalloc will grab the first block from the next
largest referenced non-empty free list and partition it as required.
The trick to performance is keeping the free lists consistent is to NOT
keep them optimal all the time.  Free lists reference the next largest
and usually non-empty "pivotal" free lists to avoid searching all the
lists all the time.  The pivot lists are partially rehashed
( recomputed ) once a number of allocations have been made on a "dirty"
pivot.  This means that the free block found is not always optimal but
"most times highly" optimal.

MMmalloc realloc performance for small sizes is optimized since it uses
it's own memcpy routine that assumes double word and non-overlapped
data.  Since it is difficult to extend sizes of quick blocks, MMmalloc
realloc will promote 'quick' allocations to normal allocations based on
some threshold destination size constant.

One major difference between most other mallocs and MMmalloc is method
of coalescing blocks being freed.  At free() time, most other mallocs
will coalesce adjacent free'd blocks ( forward as well as backward )
however, MMmalloc will take short cuts and only coalesce free'd blocks
directly after the one being free'd.  This reduces the amount of effort
spent coalescing and partitioning blocks.  Depending on some threshold
conditions, MMmalloc will coalesce selected free blocks when it has
exhausted searches. This helps the multiple free list algorithm so as
to distribute free blocks to the many free lists hence reducing the
time rehashing dirty pivots as well as partitioning large free blocks.

As mentioned earlier, MMmalloc allows the application to unmap unused
pages. This is performed by the introduction of the "recycle()" entry
point. Recycle coalesces free blocks and performs garbage collection
and recycling ( return to the operating system ). This creates yet
another level to the allocation hierarchy being the unmapped allocator
which has similar properties to the main MMmalloc allocator but
dedicated to unmapped or `untouchable' pages.  There is also a
re-entrant version of recycle named rerecycle() that is safe to be
called by a signal handler. On return from rerecycle it is not
guaranteed that recycling has actually been performed but that
recycling will be performed if it safe to do so or by the process
currently inside MMmalloc's routines before it returns. rerecycle also
checks to see if it is worthwhile to call recycle by checking the
amount of memory returned by free() since the last time it was called
to avoid an unnecessary walk of the arena.

MMmalloc's memalign is persistent.  A block returned by memalign will
retain alignment even after a realloc if it's new size permits it to
be.

MMmalloc also has a sibling library to emulate the amalloc(3P)
interface. libamalloc.so uses MMmalloc's libmalloc.so for it's main
allocation routines instead of providing a completely different set.
Also available is the ability to add memory to your arena with the
aaddmem function.  This is useful for extending the size of an arena
when you have unrelated processes sharing an arena rather than using
the "grow" callback function which may not be in the same address space
for every process.


Additional Features
-------------------

MMmalloc is sensitive to the environment variable MALLOC_DEBUG. 
Setting MALLOC_DEBUG to 1 will force MMmalloc to check the arena for
consistentcy on every call to the library.  Setting this to 1 makes
calls the MMmalloc very slow since the entire arena is checked for
consistentcy on every call.  This is the same as calling
mallopt(M_DEBUG,1).  Successfull return when debug mode is on will
guarantee that the malloc data structures are consistent. 
malloc_check() can also be called at any time by the application to
validate arena consistentcy.

This version of MMmalloc also has a built in signal handler attached to
SIGRTMIN that is armed if the file /var/malloc/ArmMMmalloc exists and
is readable and the environment variable MALLOC_NOARM is not set. The
file /var/malloc/ArmMMmalloc is kept open so that it can easily be
identified which processes are currently armed by fuser(1M). This is
intended for use by an external swap monitor daemon that will send
SIGRTMIN signals to the armed processes. On receipt of a SIGRTMIN, the
application will be forced to call recycle and a report of memory
recycled will be placed in /tmp/MMmalloc.log if enabled. The logging is
enabled by default but can be disabled by the second character in the
MALLOC_DEBUG variable. To disable malloc debugging and recycle logs use
MALLOC_DEBUG="00". To enable recycle logs only use MALLOC_DEBUG="01".
To enable both use MALLOC_DEBUG="11".

The MALLOC_CONFIG environment variable allows the selection of a
configuration of constants that MMmalloc utilizes in it's algorithms.
MALLOC_CONFIG can be set between 1 and 4 with the following meanings.

    1 - default - fast and memory efficient
    2 - faster and memory hog
    3 - slower and more memory efficient
    4 - tuned for libil and fast big memory hog with good aging

The MALLOC_CONFIG default can be set by the application by setting a
global variable int _mm_defaultoptions = N; Where N is 1-4 as above.

MALLOC_CONFIG can also be used to tweak the configuration being used.
The intention is to allow the programmer to tweak the configuration
during an applications optimization.  It is not intended as an ugly
interface to the malloc library and should not be used in production
code as it will likely change in the future.  The string in
MALLOC_CONFIG can be a colon ( : ) separated list of configuration
parameters.  The parameter name is followed by an equal ( = ) and a
numeric string that will be used as it's parameter. No white space is
tolerated. The parameters are not totally independent and bad values
will cause MMmalloc to fail.

The following example will set the mm_ntopromo parameter to 300 and
mm_minslots to 256 and use the default values from config 1. Numbers
with a leading '0' are assumed to be base 8 and '0x' are base 16.

    MALLOC_CONFIG="1:mm_ntopromo=300:mm_minslots=0x100"
    export MALLOC_CONFIG
    <run application>

Care should be taken when choosing new configuration values as they are
interdependent. The following are the MALLOC_CONFIG parameters. Values
in ()'s are the settings for the default configurations 1-4
respectively.

mm_asizshft	(3 3 3 4)

    This is the size requested granularity adjustment parameter. 
    All malloc requests will be rounded upwards to the nearest
    multiple of 2^mm_asizshft. It is bad to have mm_asizshft less
    than 3.  e.g. mm_asizshft=4 will round all requests to the
    nearest multiple of 16. If mm_nszmult=16 it will guarantee that
    all allocations will be returned on a 16 byte boundary.  Quick
    allocator slots will also be based on multiples of this size.
    mm_asizshft should not be set to less than 2 on 32 bit systems
    and 3 on 64 bit systems.
    
    mm_asizshft also determines the alignment of pointers returned
    by malloc and realloc.


mm_ntopromo	(20 10 0 0)

    This is the number of requests required for a quick allocator
    before actually activating the quick allocator for that size.

mm_nqalist	(5 34 7 128)

    This is the number of quick allocators that will be used.  This
    determines the size of the largest request that can be destined
    for the quick allocators.

	max quick allocator size =
	    mm_nqalist * ( 1 << mm_asizshft ) - overhead

    overhead in this case is the size of a pointer which is 4 bytes
    on a 32 bit system and 8 bytes on a 64 bit system.

mm_maxslots	(120 120 30 45)

    Quick allocator block sizes grow as a proportion of the number
    of requests for a quick allocator.  This will be pegged to
    mm_maxslots to avoid creating quick allocator blocks that are
    too large.  The larger the block the less likely it all quick
    allocations in it will be free'd and hence it becomes locked
    into a quick allocator instead of potentially returning it to
    the main pool.

mm_minslots	(10 5 20 2)

    This is the minimum number of slots allowed for a quick
    allocator block.  If there are too few allocations then the
    computed number of slots may be too small so this will limit
    the minimum value.

mm_adjfactor	(12 16 24 6)

    This if the quick block size adjustment factor.  This is used
    to scale the number of `extensions' for a slot to the number to
    allocate for a new extension.  Extension is allocation of a new
    large block.  mm_adjfactor is normalized at 16.  An
    mm_adjfactor value of 16 is a scale of 1.0.  e.g. setting the
    mm_adjfactor to 8 ( making it a scale of 0.5 ) will evaluate
    the number of slots in a new extension to be 0.5 * the number
    of slots extended so far for a quick allocator.

mm_qblkmult	(64 256 8 4096)

    On top of all the minimum and maximum settings, the size of the
    quick allocator blocks are rounded up to the nearest multiple
    of mm_qblkmult.  mm_qblkmult must be a power of 2 otherwise
    MMmalloc will fail.

mm_nszmult	(8 16 8 2048)

    This is the granularity adjustment for the normal allocator. 
    All allocations in the normal allocator will be rounded to this
    value. This must be a power of 2.  Setting this value to less
    than 4 will cause MMmalloc to fail.

mm_xf[0].mm_flindx  (120  90 110  63)
mm_xf[0].mm_szshft  (  5   5   4  11)

mm_xf[1].mm_flindx  (127 105 125  94)
mm_xf[1].mm_szshft  ( 12  12  11  17)

mm_xf[2].mm_flindx  (129 109 129 110) 
mm_xf[2].mm_szshft  ( 18  16  17  22)

    The above values determine the free list number selection. 
    These are used to determine what free list index to search for
    an allocation request of a given size. There are three pairs of
    mm_flindx and mm_szshft parameters.  Each set determines an
    allocation tier.  The size requested is shifted by mm_szshft
    bits to the right ( division by 2^mm_szshft ) and the resultant
    value is compared to mm_flindx to determine if the size belongs
    on the next tier or the value is adequate for an index.  On the
    last tier, sizes that are beyond are dropped into the last free
    list.  It is important that the following relation is held true
    otherwise unpredictable results will occur :

    mm_xf[N].mm_flindx*(1 << mm_xf[N].mm_szshft) < (1 << mm_xf[N+1].mm_szshft)

    Setting parameters such that (mm_xf[0].mm_flindx << 1) is less
    than mm_nszmult will cause unused free lists to be created which
    is a waste.

mm_zeromalloc	(0 0 0 0)

    This determines the behavior of malloc( 0 ).  mm_zeromalloc=0
    will force malloc to return ( void * ) 0.  mm_zeromalloc=1 will
    force malloc to return a pointer that can be used to call
    free(). Any dereferences to the pointer will have undefined
    behavior.

mm_maxsrch	(20 50 20 512)

    This determines the number of attempts to search a free list
    before giving up and using a larger free list.  Larger values
    will persist in searching a free list and hence trade off speed
    with memory.

mm_brkmult	(8192 16384 16384 16384)

    When memory is requested from the system it will be requested
    in multiples of this size.  It is important that this value be
    a power of 2.

mm_minrmdr	(32 32 16 16)

    This determines how free blocks are partitioned the smallest.
    If the remaining size in a free block is less than this size
    after partitioning it is not partitioned and memory is assumed
    allocated to the requested block.  It is important that this
    value is not smaller than the size of 4 pointers. 16 bytes on
    a 32 bit system and 32 bytes on a 64 bit system.  It can also
    be used to reduce micro-fragmentation of the arena.

mm_gcthresh	(81920 1048576 0 1048576)

    After an unsuccessful search of a free list, this value is used
    to determine is a coalesce operation should be performed on the
    free list just searhed.  If more than mm_gcthresh bytes have
    been freed since the last time a coalesce was performed and
    more than mm_gcthresh are  are currently unused in the arena
    then a coalesce will take place.

mm_missthrash	(6 10 4 2)

    This determines the number of allocations on a dirty pivot that
    will be satisfied before a rehash of the free list is computed.

mm_flsearh	(20 10 60 10)

    This determines the number of empty pivot free lists that will
    be tolerated before a rehash of the free lists.

mm_reallthrsh	(128 128 64 256)

    This is used by realloc to determine what sizes will be
    reallocated in the normal arena instead of the quick arena.

mm_nunmaplists	(16 8 8 8 )

    This determines the number of unmapped free lists used. These
    will be used by recycle to keep unmapped regions from the main
    arena but will allocate from these regions before calling
    sbrk() again.

mm_szunmapshift	(14 12 12 12)

    This determines the sizes of the unmapped lists. This will be
    used in a similar way to mm_xf[0].mm_szshft but there is only
    one tier.

mm_unmapalign	(4096 4096 4096 4096)

    This must be equal to the pagesize of the system.  This will be
    used to determine which boundaries are suitable to mmap/munmap.

mm_minunmapsize	(8192 4096 4096 4096)

    This determines the smallest region that will be unmapped.

mm_minunmapsrch	(0 0 0 0)

    This determines the smallest free list size that will be used
    for coalescing by recycle.

mm_minfreerecy	(0 0 0 0)

    This is used by rerecycle to determine how many bytes must be
    available before it will call recycle.

mm_debug_on	(0 0 0 0)

    mm_debug_on sets debug mode on if it is 1 and off if 0. Setting
    this to 1 is the same as setting MALLOC_DEBUG to 1.  This will
    force a malloc_check to be performed on every entry to MMmalloc.

mm_abort_badfree (0 0 0 0)

    This determines behavior of a free of an already free'd block.
    Setting mm_abort_badfree to 1 will cause MMmalloc to core dump
    on a free of an unidentifiable block.  Setting this value to 2
    will force mmalloc print messages regarding the error on
    standard error (stderr).

mm_clronfree	(0 0 0 0)
mm_valclronfree	(0 0 0 0)

    mm_clronfree can be set to 1 which will enable the clear on free
    option as in mallopt.  mm_valclronfree will be used as the value
    to use.

mm_reportrecy	(0 0 0 0)

    Setting mm_reportrecy to 1 will disable rerecycle reporting to
    the /tmp/MMmalloc.log file.

The MM_CONFIG structure can also be used to determine compile time
parameters for the malloc configuration.

New Functions in MMmalloc
-------------------------

size_t	recycle( void )
size_t  arecycle( void * arena )

    This will coalesce all free lists with sizes larger than a threshold
    (mm_minunmapsrch) and unmap pages that are completely free and larger
    than a threshold (mm_minunmapsize).

    Recycle will call _mm_munmap and _mm_mmapmem to map and unmap memory
    in the arena.  These are provided as weak symbols and can be
    overridden by the application to perform a similar but perhaps
    different operation.  The same functions will be called by arecycle.

void rerecycle( void )

    This is a signal handler safe version of recycle.  It is not guaranteed
    that recycle will have been called on return from rerecycle but it will
    be called either by the signal handler or the process that currently
    has the malloc lock before it returns from the malloc library call.
    There is no arerecycle() entry point.

    rerecycle() will also write a summary line in /tmp/MMmalloc.log if
    it mm_reportrecy is set to 0 and mm_minfreerecy bytes have been
    free'd since the last call to recycle().

    The following is an example of output from PID 27888, the process was
    able to recycle/unmap 139264 bytes from the address space.  It total,
    196608 bytes have been allocated by sbrk and 49240 bytes are still
    allocated to the application. Memory left is either free or overhead
    in MMmalloc.
    
 27888 - recycled    139264 sbrk    196608 unmapped    139264 aloc     49240


void malloc_check( void )
void amalloc_check( void * arena )

    This will validate the malloc arena data structures to make sure there
    is no corruption.  On failure, malloc_check will NOT return to the
    caller but will force a SIGSEGV signal.  If malloc_check was able to
    identify a problem it will write an error message to standard error
    ( file descriptor 2 - not stderr ).
    
	Bad quick slot : overwrite before allocated mem
	**** MMmalloc panic identifier 0x10000a16
	**** Possible problem/corrupted addresses 0x10056744 or 0x10053b20
	Dumping core
	Process 25934 (mstress.mm)  Segmentation fault (Signal 11)

    The message will usually have a likely cause of error after a ':'.
    It is impossible to determine exactly what the problems are so
    take this likely cause of error as a guess only.
    
    The following is output using the MMdbx dbx script. This is output 
    from MMdbx on the error corresponding to the failure above.
    
	0x5fff0934 = "Bad quick slot : overwrite before allocated mem\n"
	0x100572e4
	0x10056b88
	0x10000a16
	2
	1

    There will be two likely problem addresses printed that could be the
    corrupted words.  The most likely problem address is the first one
    printed.  In some cases the second address is the address being
    referenced.  The rest are ID's so that the problem can be traced to
    a line and state in MMmalloc.

    malloc_check is very exhaustive but does not detect an invalid virtual
    address before accessing it in all cases.  For some errors,
    malloc_check will be forced to reference an invalid address and it will
    not output any error messages before dumping core.  However you may
    still be able to run the MMdbx script from dbx on the resultant core
    and get meaningfull diagnostics as described above.

    It is possible to call malloc_check from the debugger but is only
    reliable if the application is not currently within libmalloc.
    malloc_check also marks and unmarks structures in the arena so it
    is unwise to capture the malloc_check SIGSEGV signal and continue
    operation since all marks may have not been unmarked.

struct mallinfo qmallinfo( void )
struct mallinfo aqmallinfo( void * arena )

    This is a quick version of mallinfo() that will only fill the following
    fields of the struct mallinfo record :-
    
	arena
	usmblks
	uordblks
	fordblks
    
    These are provided by running totals accumulated by MMmalloc and do
    not require walking the entire arena to compute.

void * malignoff( size_t alignment, size_t offset, size_t size )
void * amalignoff( size_t alignment, size_t offset, size_t size, void * arena )

    This is a more general version of memalign.  It allows you to provide
    an offset into the allocated memory that is where the alignment is
    desired.  Values for alignment must be a power of 2. malignoff
    does have a larger memory use overhead than malloc so it should
    only be used sparingly.

void addmem( void * p_mem, size_t size )
void aaddmem( void * p_mem, size_t size, void * arena )

    This allows the application to add any memory to an arena.

int _mm_defaultoptions = N;

    This allows the application to override the default configuration
    being by having _mm_defaultoptions set before any call to malloc.

New mallopt Commands
--------------------

    M_ASSIGNLOCK    This is only available to amallopt.  It allows the
		    assignment of a lock to an arena.  This is the same
		    lock as created by acreate() but it can be assigned
		    to the arena at any time.  This only effects the
		    amalloc, afree, arealloc, acalloc, amallopt, arecycle,
		    amallinfo interface.  For controlling threading on
		    malloc, free, realloc, calloc, mallopt, mallinfo,
		    recycle, qmallinfo, malloc_check etc you should
		    investigate the usconfig function with the parameters
		    CONF_STHREADMALLOCOFF or CONF_STHREADMALLOCON.  It
		    is also up to the user to free the lock when nessasary.

    M_USERDATA	    This allows the user to set a data field in the
		    arena structure.  This value is later passed to
		    _mm_munmap and _mm_mmapmem during a call to recycle.

Reporting New Problems
----------------------

In the meantime, you may contact me directly via email if you discover
any problems with MMmalloc.

    "Gianni Mariani" <gianni@neu.sgi.com>


Known Problems or Bugs
----------------------

recycle() will create a large number of virtual memory regions.
IRIX 5.2 has an O(N) algorithm for handling page faults with
respect to the number of mapped regions so the performance will
degrade as more and mapped regions are created.  This is a
problem for any application making extensive use of mmap and
munmap and creating large numbers of regions.  This problem may
be corrected in future releases of IRIX.

addmem() touches the last page of memory being added making it
unsuitable for large AUTOGROW mapped files.

libmalloc's memalign() behaves sensibly if an alignment other
than a power of two is given while MMmalloc will fail as will
libc's malloc.

Do not install MMmalloc on IRIX system release befores 5.2 as you
may expose some nasty bugs in the memory system.

malloc_check does not always write an error to standard error.

Small shared arenas do not have a reasonable MMmalloc configuration.

API for configuring MMmalloc parameters is very weak.

.3f04


Files of interest from "src/swtools/MMmalloc" directory

Source

Documentation


Select any combo of files you'd like to send yourself a compressed tar image of. Executables/scripts are indicated with a trailing `*' character. (Depending upon the browser, it may be necessary to hold down the Ctrl key to select/deselect disjoint items.) a compressed tar image of the above-selected items.
OR, ...
a compressed tar image of the entire MMmalloc directory.

Copyright © 1995, Silicon Graphics, Inc.